# __main__
n = 5
g = [(0, 1), (0, 3), (1, 2), (1, 4), (2, 3), (2, 4), (3, 4)]
edges = [[0] * n for _ in range(n)]
for u, v in g:
    edges[u][v] = edges[v][u] = True
visited = [False] * n # 记录顶点是否已访问过
x = [0] * n           # 记录经过顶点的顺序

# 从顶点0出发, 初始化visited[0]与x[0]
visited[0] = True     
x[0] = 0

k = 1
while k >= 1:
    x[k] = x[k] + 1  # 搜索下一个顶点
    while x[k] < n:
        # 若子节点x[k]有路径且没有访问过，则进行下一步判断
        # 否则继续搜索下一个顶点
        if edges[x[k - 1]][x[k]] and not visited[x[k]]:
            break
        else:
            x[k] = x[k] + 1

    # 找到符合要求的回路，结束循环搜索
    # k=n-1表示所有顶点均已访问过
    # g.edges[x[k]][0]为真, 表示终点到起点0存在路径，形成回路
    if x[k] < n and k == n - 1 and edges[x[k]][0]:
        break

    # 未完成全部搜索，将当前节点加入已访问列表，继续寻找下一个子节点
    # k < n-1表示仍有节点未访问
    if x[k] < n and k < n - 1:
        visited[x[k]] = True
        k = k + 1
    else:
        # x[k]>=n表示没有在剩余顶点中找到符合要求的子节点。回溯到上一节点
        x[k] = 0
        k = k - 1
        visited[x[k]] = False

# 循环结束, 输出结果回路
print(*x, sep='->', end='->0')
